Appearance
js hook
元信息
- 目标:理解模块化缺失年代的"外挂"手法——钩子与猴子补丁如何拦截、观测、改写既有函数行为,读懂逆向分析与调试场景里的 Hook 代码
- 关键概念:hook、猴子补丁、函数重写、Proxy、Reflect、defineProperty
- 关联阶段:cp3
- 常见误区:以为 Hook 是浏览器提供的专门 API(只是"函数是对象、可替换包裹"的语言特性运用);以为 Hook 后原函数就废弃了(保留
_原函数名引用再包一层才是正道,否则破坏程序逻辑);以为 Hook 只用于逆向(框架桩、监控埋点、测试 mock 同源)
1️⃣ 什么是 JSHook
JSHook本质上是一种拦截和修改 JavaScript 函数行为的技术。 在 JS 逆向中,它通常用于:
- 拦截网页或 APP 内的关键函数,获取调用参数、返回值。
- 修改函数行为,例如跳过验证逻辑或返回特定值。
- 调试或分析加密/混淆算法。
原理
在 JavaScript 中,函数是对象,所以可以替换或包裹函数。 常用的手段包括:
- 重写函数:直接覆盖原函数。
- Proxy/Reflect:动态拦截对象方法。
- Monkey Patch:动态替换方法并保留原始调用。
2️⃣ 常见 Hook 技术与方法
2.1 重写函数
✅ 场景:获取加密函数输入输出、调试加密逻辑。
2.2 Proxy/Reflect 拦截对象
若要拦截函数调用本身,apply 陷阱要求代理的目标必须是一个函数:
✅ 场景:Hook 对象方法、监控参数和返回值,尤其适合封装在对象里的 API。
2.3 替换原生方法
浏览器提供了大量原生方法可用于 Hook:
✅ 场景:抓包、修改网络请求、绕过反爬虫检测。
类似的可以 Hook XMLHttpRequest, WebSocket, console.log, localStorage 等。
2.4 拦截对象属性(getter/setter)
✅ 场景:修改关键变量返回值,绕过权限或验证逻辑。
2.5 Hook 定时器和事件
setTimeout, setInterval 常用于加密/防刷检测,Hook 可以劫持它们:
类似地可以 Hook addEventListener 捕获事件回调。
3️⃣ JS逆向中 Hook 的应用场景
| 场景 | Hook 技术 | 示例 |
|---|---|---|
| 加密/签名 | 重写函数 / Proxy | 获取加密前的原始参数和结果 |
| 网络请求 | 替换 fetch / XHR | 修改请求参数或抓取敏感信息 |
| 防调试/防爬虫 | 替换 console.log / eval | 绕过无限 debugger / 监控 eval 参数 |
| 页面敏感数据 | getter/setter / Proxy | 修改关键变量,绕过逻辑判断 |
| 游戏逆向 | 函数重写 / Object.defineProperty | 修改角色属性或游戏数据 |
⚡ 小技巧:在 Hook 时最好 保留原函数,通过
_原函数名调用,避免破坏程序逻辑。